#!/usr/bin/env python3
"""
数据预处理系统主程序
"""

import os
import sys
import logging
import argparse
from pathlib import Path

# 添加项目根目录到Python路径
project_root = Path(__file__).parent.absolute()
sys.path.insert(0, str(project_root))

from src.web.app import app, init_app


def setup_logging(log_level=logging.INFO, log_file=None):
    """设置日志配置"""
    
    # 日志格式
    log_format = '%(asctime)s - %(name)s - %(levelname)s - %(message)s'
    
    # 日志处理器
    handlers = [logging.StreamHandler(sys.stdout)]
    
    if log_file:
        # 确保日志目录存在
        log_dir = os.path.dirname(log_file)
        if log_dir and not os.path.exists(log_dir):
            os.makedirs(log_dir, exist_ok=True)
        handlers.append(logging.FileHandler(log_file, encoding='utf-8'))
    
    # 配置日志
    logging.basicConfig(
        level=log_level,
        format=log_format,
        handlers=handlers,
        force=True
    )
    
    # 设置第三方库日志级别
    logging.getLogger('werkzeug').setLevel(logging.WARNING)
    logging.getLogger('urllib3').setLevel(logging.WARNING)


def create_directories():
    """创建必要的目录"""
    directories = [
        'logs',
        'uploads',
        'exports',
        'temp',
        'data'
    ]
    
    for directory in directories:
        os.makedirs(directory, exist_ok=True)
        
    print(f"✓ 目录创建完成")


def check_dependencies():
    """检查依赖包是否安装"""
    required_packages = [
        'flask',
        'sqlalchemy',
        'pandas',
        'openpyxl',
        'requests'
    ]
    
    missing_packages = []
    
    for package in required_packages:
        try:
            __import__(package)
        except ImportError:
            missing_packages.append(package)
    
    if missing_packages:
        print(f"❌ 缺少依赖包: {', '.join(missing_packages)}")
        print(f"请运行: pip install -r requirements.txt")
        return False
    
    print(f"✓ 依赖检查完成")
    return True


def main():
    """主函数"""
    parser = argparse.ArgumentParser(description='数据预处理系统')
    
    parser.add_argument('--host', default='0.0.0.0', help='服务器主机地址')
    parser.add_argument('--port', type=int, default=5000, help='服务器端口')
    parser.add_argument('--debug', action='store_true', help='启用调试模式')
    parser.add_argument('--log-level', default='INFO', 
                       choices=['DEBUG', 'INFO', 'WARNING', 'ERROR'],
                       help='日志级别')
    parser.add_argument('--log-file', help='日志文件路径')
    parser.add_argument('--config', help='配置文件路径')
    parser.add_argument('--check', action='store_true', help='检查系统环境')
    
    args = parser.parse_args()
    
    # 设置日志
    log_level = getattr(logging, args.log_level.upper())
    log_file = args.log_file or 'logs/app.log'
    setup_logging(log_level, log_file)
    
    logger = logging.getLogger(__name__)
    
    try:
        logger.info("=" * 60)
        logger.info("数据预处理系统启动")
        logger.info("=" * 60)
        
        # 创建目录
        create_directories()
        
        # 检查依赖
        if not check_dependencies():
            sys.exit(1)
        
        # 如果只是检查环境
        if args.check:
            logger.info("环境检查完成")
            return
        
        # 加载配置文件
        if args.config and os.path.exists(args.config):
            logger.info(f"加载配置文件: {args.config}")
            # TODO: 实现配置文件加载
        
        # 初始化应用
        init_app()
        
        # 启动Web服务器
        logger.info(f"启动Web服务器: http://{args.host}:{args.port}")
        logger.info(f"调试模式: {'开启' if args.debug else '关闭'}")
        
        # 设置Flask配置
        if args.debug:
            app.config['DEBUG'] = True
            app.config['TEMPLATES_AUTO_RELOAD'] = True
        
        # 启动应用
        app.run(
            host=args.host,
            port=args.port,
            debug=args.debug,
            threaded=True
        )
        
    except KeyboardInterrupt:
        logger.info("收到停止信号，正在关闭服务器...")
    except Exception as e:
        logger.error(f"启动失败: {str(e)}", exc_info=True)
        sys.exit(1)
    finally:
        logger.info("数据预处理系统已停止")


if __name__ == '__main__':
    main()